/*	Nama file		: ListOfString.h
	Deskripsi		: Deklarasi type dan prototype primitf type List. List direpresentasi dengan pointer, First dinyatakan secara eksplisit
	Nama pembuat	: Ni Made Satvika Iswari/23512077
	Hari / Tanggal	: Selasa, 25 September 2012
*/

#ifndef ListOfString_H
#define ListOfString_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "..\Boolean\Boolean.h"

//Konstanta
#define Nil NULL
#define MAX_CHAR_LIST 1000 /* Maksimum karakter untuk sebuah string */

typedef char* infotype;
typedef struct tElmtList *address;
typedef struct tElmtList{
        infotype Info;
        address Next;
        }ElmtListStr;
typedef struct{
        address First;
        } ListStr;
 
#define Next(P) (P)->Next
#define Info(P) (P)->Info
#define First(L) (L).First

/** PROTOTYPE **/
/** Test List Kosong **/
boolean ListEmpty (ListStr L);
/* Mengirimi true jika list kosong */

/** Pembuatan List Kosong **/
void CreateList (ListStr *L);
/* Proses : Membuat list kosong */
/* I.S : sembarang */
/* F.S : Terbentuk list kosong */

/** Pembuatan List dari Deretan String **/
ListStr MakeListfromStr(char str[]);
/* Mengembalikan ListStr dari deretan string */

/** Manajemen Memori **/
address Alokasi (infotype X);
/* Mengirimkan address hasil alokasi sebuah elemen */
/* Jika alokasi berhasil, maka address tidak Nil, dan misalnya menghasilkan P, maka info(P)=X, Next(P)=Nil */
/* Jika alokasi gagal, mengirimkan Nil */
void Dealokasi (address P);
/* Proses : melakukan dealokasi/pengembalian address P */
/* I.S : P terdefinisi */
/* F.S : P dikembalikan ke sistem */

/** Pencarian Sebuah Elemen List **/
address Search (ListStr L, infotype X);
/* Mencari apakah ada elemen list dengan info(P)=X */
/* Jika ada, mengirimkan address elemen tersebut */
/* Jika tidak ada, mengirim Nil */
boolean FSearch(ListStr L, address P);
/* Mencari apakah ada elemen list yang beralamat P */
/* Mengirimkan true jika ada, false jika tidak ada */

/** PRIMITIF BERDASARKAN NILAI **/
/** Penambahan Elemen **/
void InsVFirst (ListStr *L, infotype X);
/* Proses : Melakukan alokasi sebuah elmen dan menambahkan elmen pertama dengan nilai X jika alokasi berhasil
            Jika alokasi gagal : I.S = F.S */
/* I.S : L mungkin kosong */
/* F.S :  X ditambahkan sebagai elemen pertama L */

void InsVLast(ListStr *L, infotype X);
/* I.S L mungkin kosong */
/* F.S X ditambahkan sebagai elemen terakhir L */
/* Proses : melakukan alokasi sebuah elemen dan menambahkan elmen list di akhir:
            elemen terakhir yang baru bernilai X jika alokasi berhasil
            Jika alokasi gagal : I.S = F.S */

/** PRIMITIF BERDASARKAN ALAMAT **/
/** Penambahan Elemen Berdasarkan Alamat **/
void InsertFirst(ListStr *L, address P);
/* Proses : Menambahkan elemen ber-address P sebagai elemen pertama */
/* I.S : Sembarang, P sudah dialokasi */
/* F.S : P menjadi elemen pertama list */
void InsertAfter(ListStr *L, address P, address Prec);
/* Proses : Insert P sebagai elemen sesudah elemen beralamat Prec */
/* I.S : Prec pastilah elemen list dan bukan elemen terakhir, P sudah dialokasi */
/* F.S : P menjadi elemen sesudah elemen beralamat Prec */
void InsertLast(ListStr *L, address P);
/* Proses : P ditambahkan sebagai elemen terakhir yang baru */
/* I.S : sembarang, P sudah dialokasi */
/* F.S : P menjadi elemen terakhir yang baru */

/** Operator Baca/Tulis **/
void BacaList (ListStr *L);
/* Proses : Membaca komponen List dari masukan pengguna */
/* I.S. : Sembarang */
/* F.S. : L terdefinisi */

void TulisList(ListStr L);
/* Proses : Menulis nilai setiap komponen L ke layar */
/* I.S. : L terdefinisi */
/* F.S. : Nilai L ditulis ke layar beserta komponen-komponennya */

/** Predikat **/
char* ListStrToString(ListStr L);
/* Mengembalikan list nama dengan dipisahkan dengan tanda koma */


#endif
